package com.zhen.gulimall.product.exception;

import com.zhen.common.exception.BizCodeEnumes;
import com.zhen.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;

/**
 * 集中异常处理类
 *@ControllerAdvice(basePackages = "com.zhen.gulimall.product.app") 通过包指定可以处理那些包抛出的
 */
@Slf4j // lombok 的日志记录
//@ResponseBody
//@ControllerAdvice(basePackages = "com.zhen.gulimall.product.app")
// 相当于 @ControllerAdvice 和 @ResponseBody 的组合注解
@RestControllerAdvice(basePackages = "com.zhen.gulimall.product.app")
public class GulimallExceptionControllerAdvice {

    // 处理校验异常的方法
    // @ExceptionHandler(value = Exception.class) 通过value 值指定可以解决那些异常
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleValidException(MethodArgumentNotValidException e){
        // 日志
        log.error("数据校验出现错误{},异常类型{}",e.getMessage(),e.getClass());
        BindingResult result = e.getBindingResult();
        HashMap<String, String> map = new HashMap<>();
        // 将错误信息遍历取出 放到map 之中
        result.getFieldErrors().forEach(fieldError ->
            map.put(fieldError.getField(),fieldError.getDefaultMessage()));
        return R.error(BizCodeEnumes.VALID_EXCEPTION.getCode(), BizCodeEnumes.VALID_EXCEPTION.getMsg()).put("data",map);
    }

    // 处理公共异常的方法
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable){
        log.error("系统未知异常{}，类型{}",throwable.getMessage(),throwable.getClass());
        throwable.printStackTrace();
        return R.error(BizCodeEnumes.UNKNOW_EXCEPTION.getCode(), BizCodeEnumes.UNKNOW_EXCEPTION.getMsg());
    }
}
